﻿using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using STeaL.Algorithm;

namespace Test {

  [TestClass]
  public class ICollectionTest {
    public ICollectionTest() {}

    private TestContext testContextInstance;

    public TestContext TestContext {
      get { return testContextInstance; }
      set { testContextInstance = value; }
    }

    #region 追加のテスト属性
    // クラス内で最初のテストを実行する前に、ClassInitialize を使用してコードを実行してください
    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext) { }

    // クラス内のテストをすべて実行したら、ClassCleanup を使用してコードを実行してください
    [ClassCleanup()]
    public static void MyClassCleanup() { }

    // 各テストを実行する前に、TestInitialize を使用してコードを実行してください
    [TestInitialize()]
    public void TestInitialize() {
      c = new List<int>();
    }

    [TestCleanup()]
    public void MyTestCleanup() { }
    #endregion

    [TestMethod]
    public void size() {
      Assert.AreEqual(0, c.size());
      c.Add(1);
      Assert.AreEqual(1, c.size());
      c.Add(2);
      Assert.AreEqual(2, c.size());
    }

    [TestMethod]
    public void empty() {
      Assert.IsTrue(c.empty());
      c.Add(1);
      Assert.IsFalse(c.empty());
      c.Add(2);
      Assert.IsFalse(c.empty());
      c.Clear();
      Assert.IsTrue(c.empty());
    }

    [TestMethod]
    public void assign_1() {
      Assert.IsTrue(c.empty());
      c.assign(10, 5);
      Assert.AreEqual(10, c.size());
      foreach ( int n in c ) Assert.AreEqual(5, n);
      c.assign(5, 10);
      Assert.AreEqual(5, c.size());
      foreach (int n in c) Assert.AreEqual(10, n);
    }

    [TestMethod]
    public void assign_2() {
      int i;
      Assert.IsTrue(c.empty());
      c.assign(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
      Assert.AreEqual(10, c.size());
      i = 0;
      foreach (int n in c) Assert.AreEqual(i++, n);
      c.assign(new int[] { 0, 2, 4, 6, 8});
      Assert.AreEqual(5, c.size());
      i = 0;
      foreach (int n in c) Assert.AreEqual((i++)*2, n);
    }

    [TestMethod]
    public void clear() {
      Assert.IsTrue(c.empty());
      c.clear();
      Assert.IsTrue(c.empty());
      c.assign(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
      Assert.IsFalse(c.empty());
      c.clear();
      Assert.IsTrue(c.empty());
    }

    private ICollection<int> c;
  }
}
